import { arrToMap } from "../utils/common";

const db = uniCloud.database();
const backend = uniCloud.importObject('backend');

export class FutureUtils {
	/**
	 * 增加，不删除原来的id。
	 * 所以只会确保在传入的 dates 对应的日期中，是存在id的。
	 */
	public static async add(type : 'memory' | 'plan' | 'event', id : string, dates : number[], create_by : string) {
		const fieldName = type + '_ids';
		const dbCmd = db.command;
		const result = await db.collection('future').where({
			date: dbCmd.in(dates)
		}).field({ date: true, [fieldName]: true }).get();

		const existArr = result.result.data; // 没查到数据，则为空数组。
		const map = arrToMap(existArr, 'date');
		const notExistArr = dates.filter(ms => !map['' + ms]);
		if (notExistArr.length > 0) {
			const toNewAddItem = notExistArr.map(ms => {
				return { date: ms, create_by: create_by, [fieldName]: [id] };
			});
			await db.collection('future').add(toNewAddItem);
		}
		console.log('========', existArr);
		// 不存在id的，才追加。已经存在的不用再处理。
		const needToAppendArr = existArr.filter(obj => !obj[fieldName].includes(id));
		if (needToAppendArr.length > 0) {
			const appendDates = needToAppendArr.map(obj => obj.date);
			await backend.futureUpdate(fieldName, appendDates, id);
			// await db.collection('future').where({
			// 	date: dbCmd.in(appendDates)
			// }).update({
			// 	[fieldName]: dbCmd.push(id)
			// });
		}
	}

	/**
	 * 删除。
	 */
	public static async del(type : 'memory' | 'plan' | 'event', id : string, dates : number[]) {
		const fieldName = type + '_ids';
		const dbCmd = db.command;
		// 返回删除的记录数量
		return await db.collection('future').where({
			date: dbCmd.in(dates),
			[fieldName]: id,
		}).remove();
	}

	/**
	 * 查询指定日期集合中的内容。
	 */
	public static getDatesTemp(dates : number[], field : string) {
		const dbCmd = db.command;
		// 返回删除的记录数量
		return db.collection('future').where({
			date: dbCmd.in(dates)
		}).field(field).getTemp();
	}
}